import java.util.*;

public class ArrayOp {
    static public Scanner sc = new Scanner(System.in);

    // 简化printf输出语句
    static public void p(String format, Object ... obj) {
        System.out.printf(format, obj);
    }

/*
 *     随机数:
 *         不传参      整个整型范围
 *         10          10以下
 *         10 100      10 到 100的范围
 *         10 10       10以上
 *         10 0        0 到 10的范围
 *
 *     输入范围:
 *         不传参      整个整型范围
 *         10          10以下(包含负数)
 *         10 100      10 到 100的范围
 *         10 10       10以上
 *         10 0        0 到 10的范围
 *
 */
        // 获取一个整型范围
    static public int [] getRange(int [] inputRange) {
        int [] range = {Integer.MIN_VALUE, Integer.MAX_VALUE};

        if (inputRange.length == 1) {
            range[1] = inputRange[0];
        } else if (inputRange.length > 1) {
            if (inputRange[0] == inputRange[1]) {
                range[0] = inputRange[0];
            } else if (inputRange[0] > inputRange[1]) {
                range[0] = inputRange[1];
                range[1] = inputRange[0];
            } else {
                range[0] = inputRange[0];
                range[1] = inputRange[1];
            }
        }

        return range;
    }

    // 封装获取整型数
    static public int getInt(String prompt, int ... inputRange) {
        int num;
        int [] range = getRange(inputRange);

        while (true) {
            System.out.printf(prompt);
            num = sc.nextInt();
            if (num >= range[0] && num <= range[1])
                break;
        }

        return num;
    }

    // 获取随机数
    static public int rand(int ... inputRange) {
        int [] range = getRange(inputRange);

        range[0] = (range[0] < 0) ? 0 : range[0];
        range[1] = (range[1] == Integer.MAX_VALUE) ? range[1] - 1 : range[1];

        // p("start = %d, end = %d\n", range[0], range[1]);

        return (int)(Math.random() * (range[1] - range[0] + 1) + range[0]);
    }

    // 随机初始化数组
    // arr      指定初始化数组
    // len      指定初始化数组的个数
    //      arr != null     指定初始化数组的个数
    //      arr == null     指定新建数组的个数
    // range    可选项, 指定随机范围
    // 返回值
    //      arr == null  返回新数组
    //      arr != null  返回arr
    static public int [] randArr(int [] arr, int len, int ... range) {
        int [] tmpArr = (arr == null) ? new int[len] : arr;
        int valCount = tmpArr.length > len ? len : tmpArr.length;

        for (int i = 0; i < valCount; ++i) {
            tmpArr[i] = rand(range);
        }

        return tmpArr;
    }

    // 输出数组
    //      arr         指定要输出数组
    //      prompt      指定要输出的前缀样式
    //      返回值      返回输出的数组
    static public int [] showArr(int [] arr, String prompt) {
        p(prompt);
        for (int i : arr) {
            p("%d ", i);
        }
        p("\n");

        return arr;
    }

    // 输入初始化数组
    //      prompt          指定输入提示字符串
    //      arr             指定初始化的数组
    //      len             指定初始化的个数
    //          arr != null 指定初始化数组的个数
    //          arr == null 指定新建数组的长度
    //      range           指定输入数据的范围
    //      返回值
    //          arr == null 返回新建数组
    //          arr != null 返回指定初始化的数组
    static public int [] inputArr(String prompt, int [] arr, int len, int ... range) {
        int [] tmpArr = (arr == null) ? new int[len] : arr;
        int valCount = tmpArr.length > len ? len : tmpArr.length;

        for (int i = 0; i < valCount; ++i) {
            tmpArr[i] = getInt("[" + i + "]" + prompt, range);
        }

        return tmpArr;
    }

    // 返回数组最大值
    static public int arrMax(int [] arr) {
        int i, t = arr[0];

        for (i = 1; i < arr.length; ++i) {
            if (arr[i] > t) {
                t = arr[i];
            }
        }

        return t;
    }

    // 返回数组最小值
    static public int arrMin(int [] arr) {
        int i, t = arr[0];

        for (i = 1; i < arr.length; ++i) {
            if (arr[i] < t) {
                t = arr[i];
            }
        }

        return t;
    }

    // 循环左移
    static public int [] arrLeft(int [] arr, int ... count) {

        int index;

        int num  = (count.length > 0) ? count[0] : 0;

        do {
            for (int i = 0, l = arr.length - 1; i < l; ++i) {
                index = i + 1;
                arr[i] ^= arr[index];
                arr[index] ^= arr[i];
                arr[i] ^= arr[index];
            }
        } while (--num > 0);

        return arr;
    }

    // 循环右移
    static public int [] arrRight(int [] arr, int ... count) {

        int index;

        int num  = (count.length > 0) ? count[0] : 0;

        do {
            for (int i = arr.length - 1; i > 0; --i) {
                index = i - 1;
                arr[i] ^= arr[index];
                arr[index] ^= arr[i];
                arr[i] ^= arr[index];
            }
        } while (--num > 0);

        return arr;
    }

    // 数组反转
    static public int [] arrRev(int [] arr) {
        int index, l, i;

        for (i = 0, l = arr.length / 2; i < l; ++i) {
            index = arr.length - i - 1;
            arr[i] ^= arr[index];
            arr[index] ^= arr[i];
            arr[i] ^= arr[index];
        }
        return arr;
    }

    // 数组排序
    static public int [] arrSort(int [] arr) {
        int i, j, t, index;

        for (i = 0; i < arr.length; ++i) {
            for (j = i + 1; j < arr.length; ++j) {
                if (arr[i] > arr[j]) {
                    arr[i] ^= arr[j];
                    arr[j] ^= arr[i];
                    arr[i] ^= arr[j];
                }
            }
        }

        /*
         * for (i = arr.length - 1; i > 0; --i) {
         *     t = arr[i];
         *     index = i;
         *     for (j = 0; j < i; ++j) {
         *         if (arr[j] > t) {
         *             t = arr[j];
         *             index = j;
         *         }
         *     }
         *     arr[index] = arr[i];
         *     arr[i] = t;
         * }
         */

        return arr;
    }

    static public void main(String [] args) {
        /*
         * // 测试随机数 {
         * while (true) {
         *     p("no args = %d\n", rand());
         *     p("rand 10 = %d\n", rand(10));
         *     p("rand -100 -100 = %d\n", rand(-100, -100));
         *     p("rand 30 100 = %d\n", rand(30, 100));
         *     p("rand 100 100 = %d\n", rand(100, 100));
         *     p("rand 100 30 = %d\n", rand(100, 30));
         *     if (sc.nextLine().equals("q"))
         *         break;
         * }
         * // }
         */

        // showArr(randArr(null, 10, 10, 100), "rand array: ");
        // showArr(inputArr("请输入10到100的数: ", null, 10, 10, 100), "input array: ");
        int [] a = randArr(null, 10, 1, 100);

        showArr(a, "rand init array: ");
        p("max = %d, min = %d\n", arrMax(a), arrMin(a));

        // showArr(arrLeft(showArr(arrLeft(a), "left shift array: "), 2), "left shift 2 array: ");

        showArr(arrLeft(a), "left shift array: ");
        showArr(arrLeft(a, 2), "left shift 2 array: ");

        showArr(arrRight(a, 3), "right shift 3 array: ");

        showArr(arrRev(a), "Rev array: ");

        showArr(arrSort(a), "Sort array: ");

    }
}
